/*@description:nginx linux 相关配置接口
 *
 *
 *
 *
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#include <ngx_config.h>
#include <ngx_core.h>

/*@brief:u_char ngx_linux_kern_ostype[50]: linux 内核系统类型
 *		 u_char ngx_linux kern_osrelease[50]: linux的内核发行版本
 *
 */
u_char  ngx_linux_kern_ostype[50];  
u_char  ngx_linux_kern_osrelease[50];


/*@brief: nginx 系统针对于linux的IO接口族:
 *
 *
 */
static ngx_os_io_t ngx_linux_io = {
    ngx_unix_recv,  //关于系统调用recv的封装 
    ngx_readv_chain,  //分散读
    ngx_udp_unix_recv,  //基于udp的recv的封装
    ngx_unix_send, //基于系统调用send的封装
    ngx_udp_unix_send, //基于udp的send的封装 
    ngx_udp_unix_sendmsg_chain,
#if (NGX_HAVE_SENDFILE)
    ngx_linux_sendfile_chain, //如果支持sendfile系统调用
    NGX_IO_SENDFILE
#else
    ngx_writev_chain, //集中写
    0
#endif
};

/*@brief:通过uname这个系统获取所在系统环境的操作系统类型和发行版本 
 *@para: ngx_log_t *log:
 *
 *@return value:
 */
ngx_int_t ngx_os_specific_init(ngx_log_t *log)
{
	ngx_log_error(NGX_LOG_NOTICE ,log,0,"enter [function]{%s}.........................",__func__);
    struct utsname  u;

    if (uname(&u) == -1) {  //system call 
        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed");
        return NGX_ERROR;
    }
		
	//获取操作系统的类型: Linux 
    (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname, sizeof(ngx_linux_kern_ostype));
    //获取发行版本 
	(void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release, sizeof(ngx_linux_kern_osrelease));
    ngx_os_io = ngx_linux_io; //初始化全局量
	ngx_log_error(NGX_LOG_NOTICE, log, 0, "[function]{%s} uname get sysname:%s  release:%s",__func__,(u_char*)u.sysname, (u_char*)u.release);
    return NGX_OK;
}


/*@brief:
 *@para:
 *
 *
 *@return value:
 */
void ngx_os_specific_status(ngx_log_t *log)
{
    ngx_log_error(NGX_LOG_NOTICE, log, 0, "[function]{%s} OS: %s %s",__func__,ngx_linux_kern_ostype, ngx_linux_kern_osrelease);
}
